package algorithm;

public class MinSubArrayLen {
    //回去之后再好好看一下
    public static int computeSum(int[] nums,int beginIndex,int len) {
        //从数组nums的beginIndex下标开始，向后计算len长度的和
        int sum = 0;
        int count = 0;
        int index = beginIndex;
        while(count < len) {
            sum += nums[index];
            count++;
            index++;
        }

        return sum;
    }
    public static int minSubArrayLenV(int target, int[] nums) {
        //暴力枚举
        //只考虑了连续的情况
        int len = 1;
        while(len <= nums.length) {

            for (int i = 0; i <= nums.length - len; i++) {
                int sum = 0;
                sum = computeSum(nums,i,len);

                if(sum >= target) {
                    return len;
                }
            }

            len++;
        }

        return 0;
    }
    public static int findSum(int[] nums,int left,int right) {
        //对数组的指定区间求和
        int sum = 0;
        if(left == right) {
            sum += nums[left];
        } else {
            for(int i = left;i <= right; i++) {
                sum += nums[i];
            }
        }

        return sum;
    }

//    public static int minSubArrayLen(int target,int[] nums) {
//        //采用滑动窗口和单调性进行优化，时间复杂度O(n)
//        int left = 0,right = 0;
//        int len = nums.length + 1;
//        int sum = 0;
//        while(right < nums.length && left <= right) {
//
//           //在原始代码中，当sum >= target时，我们更新长度并移动左指针，但是这里有一个问题：在移动左指针后，我们并没有检查移动后的窗口是否仍然满足条件，而是直接继续循环，这可能导致我们错过更短的满足条件的窗口。
//            //实际上，当窗口满足条件时，我们应该持续移动左指针以尝试缩小窗口，直到窗口不再满足条件。这样我们才能确保找到以每个右指针为结尾的最小窗口。
//            //因此，正确的做法应该是在满足条件时，使用一个内层循环来移动左指针，直到窗口不再满足条件。
//           sum += nums[right];
//
//           //更新结果
//            if(sum >= target && left <= right) {
//                //出窗口
//                len = Math.min(len,(right - left + 1));
//                sum -= nums[left];
//                left++;
//            } else {
//                //进窗口
//                right++;
//            }
//        }
//
//        if(len == nums.length + 1) {
//            return 0;
//        }
//        return len;
//    }

    public static int minSubArrayLen(int target,int[] nums) {
        int left = 0, right = 0;
        int len = Integer.MAX_VALUE;
        int sum = 0;

        while (right < nums.length) {
            // 扩展窗口
            sum += nums[right];

            // 当满足条件时，持续收缩窗口
            while (sum >= target) {
                // 更新最小长度
                len = Math.min(len, right - left + 1);
                // 收缩窗口
                sum -= nums[left];
                left++;
            }

            // 继续扩展窗口
            right++;
        }

        return len == Integer.MAX_VALUE ? 0 : len;
    }
    public static void main(String[] args) {
         int[] nums = new int[]{1,1,1,1,1,1,1,1};
        System.out.println(minSubArrayLen(11, nums));
    }
}
